package com.swak.async.persistence;

import java.util.List;
import java.util.concurrent.CompletableFuture;

import com.swak.async.persistence.tx.TransactionContext;
import com.swak.async.persistence.tx.TransactionalFuture;
import com.swak.entity.Page;
import com.swak.entity.Parameters;
import com.swak.persistence.QueryCondition;

/**
 * 提供异步 的 CURD
 * 
 * @author lifeng
 * @date 2021年1月21日 下午3:38:41
 */
interface BaseMapper<T, PK> {

	/**
	 * 开启只读事务 -- 且必须手动提交
	 * 
	 * @return
	 */
	TransactionalFuture<Void> beginQuery();

	/**
	 * 开启事务 -- 且必须手动提交
	 * 
	 * @return
	 */
	TransactionalFuture<Void> beginTransaction();

	/**
	 * 插入数据
	 * 
	 * @param sql
	 * @param param
	 */
	<U> TransactionalFuture<T> insert(TransactionContext<U> context, T entity);

	/**
	 * 更新数据
	 * 
	 * @param sql
	 * @param param
	 */
	<U> TransactionalFuture<Integer> update(TransactionContext<U> context, T entity);

	/**
	 * 删除数据
	 * 
	 * @param sql
	 */
	<U> TransactionalFuture<Integer> delete(TransactionContext<U> context, T entity);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	<U> TransactionalFuture<T> get(TransactionContext<U> context, T entity);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	<U> TransactionalFuture<List<T>> queryByCondition(TransactionContext<U> context, QueryCondition qc);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	<U> TransactionalFuture<List<T>> query(TransactionContext<U> context, String sql, QueryCondition qc);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	<U> TransactionalFuture<Integer> countByCondition(TransactionContext<U> context, QueryCondition qc);

	/**
	 * 数量
	 * 
	 * @param sql
	 * @param param
	 * @return
	 */
	<U> TransactionalFuture<Integer> count(TransactionContext<U> context, String sql, QueryCondition qc);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	<U> TransactionalFuture<Page<T>> pageByCondition(TransactionContext<U> context, QueryCondition qc, Parameters param);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	<U> TransactionalFuture<Page<T>> page(TransactionContext<U> context, String sql, QueryCondition qc, Parameters param);

	/**
	 * 插入数据
	 * 
	 * @param sql
	 * @param param
	 */
	CompletableFuture<PK> insert(T entity);

	/**
	 * 更新数据
	 * 
	 * @param sql
	 * @param param
	 */
	CompletableFuture<Integer> update(T entity);

	/**
	 * 删除数据
	 * 
	 * @param sql
	 */
	CompletableFuture<Integer> delete(T entity);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	CompletableFuture<T> get(T entity);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	CompletableFuture<List<T>> queryByCondition(QueryCondition qc);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	CompletableFuture<List<T>> query(String sql, QueryCondition qc);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	CompletableFuture<Integer> countByCondition(QueryCondition qc);

	/**
	 * 数量
	 * 
	 * @param sql
	 * @param param
	 * @return
	 */
	CompletableFuture<Integer> count(String sql, QueryCondition qc);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	CompletableFuture<Page<T>> pageByCondition(QueryCondition qc, Parameters param);

	/**
	 * 结果
	 * 
	 * @param sql
	 * @param param
	 * @param rowMapper
	 * @return
	 */
	CompletableFuture<Page<T>> page(String sql, QueryCondition qc, Parameters param);
}
